import json

import requests

from 接口自动化.电子商城实战.utils.log_utils import logger


class BaseApi:
    def __init__(self, base_url, role):
        self.base_url = base_url
        if role:
            self.role = role

    def __set_token(self, request_infos):
        # 问题: 除录接口之外，基本每一个接口，都需要另外去设置token
        # 解决方案:
        # 1.在发起接口请求之前，就获取token信息
        # 2.获取token信息之后，塞入到请求信息之中
        #   除了method 和url 之外，所有的其他信息，包括header params 等等的其他参数，都会塞入至kwargs 不定长参数中
        #   cart_api->send->获取kwargs->在kwargs中塞入header(鉴权)信息
        admin_url = "admin/auth/login"
        admin_login_data = {
            "username": "hogwarts",
            "password": "test12345",
            "code": ""
        }
        res = requests.request(method="POST", url=self.base_url + admin_url, json=admin_login_data)
        self.token = {"X-Litemall-Admin-Token": res.json()["data"]["token"]}
        # self.admin_headers = {
        #     "X-Litemall-Admin-Token": self.token
        # }

        client_url = "wx/auth/login"
        client_login_data = {
            "username": "user123",
            "password": "user123"
        }
        res = requests.request(method="POST", url=self.base_url + client_url, json=client_login_data)
        self.client_token = {"X-Litemall-Token": res.json()["data"]["token"]}
        # self.client_headers = {
        #     "X-Litemall-Token": self.client_token
        # }

        # 多角色（token）
        # 如果是admin，那么就塞入admin的token;
        # 如果是其他，那么就塞入其他的token
        if self.role == "admin":
            self.final_token = self.token
        else:
            self.final_token = self.client_token
        # 获取herders,如果请求本身有头信息，那么就把token信息更新进去
        if request_infos.get("headers"):
            request_infos["headers"].update(self.final_token)
        else:
            request_infos["headers"] = self.final_token
        return request_infos

    def send_req(self, method, url, **kwargs):
        """
        问题1: 接口里面直接使用了requests
        解决方案: 在base_api中添加公共的send方法
        问题2:大量重复的base_url
        解决方案，在构造函数，实例化base_url，并且在send方法，就直接做拼接，这样子类的方法，就无需重复编写self.base_url
        优化3: token 的获取也放到了构造函数里面
        """
        kwargs = self.__set_token(kwargs)
        r = requests.request(method, self.base_url + url, **kwargs)
        logger.debug(f"{url}接口的响应值为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        return r.json()
